Hop til indhold
  • 0

Best practice Openhab2 - binding ver 2


EjvindHald
 Share

Spørgsmål

EDIT 25. januar 2021: Nedenstående er baseret på Openhab version 2. I Openhab version 3 er menuen anderledes, og paperUI er erstattet af anden funktionalitet.

 

Hermed et indlæg om Best Practice for openHAB binding version 2 som opfølgning på mit tidligere indlæg - se link her Først en stor tak til @Pauli Anttila for denne IHC Binding til openHAB ver 2.

Dette indlæg er ikke ment som den nemmeste måde at komme i gang med openHAB 2 på. Tværtimod kan det virke lidt besværligt, men det giver mig mulighed for at styre min installation helt præcis til mindste detalje samt en nem måde at reetablere opsætningen i tilfælde af fejl.

Som hardware kan man med fordel bruges enten Raspberry PI, Synology NAS eller Ubunto installeret på en PC. Gennem årene har jeg benyttet alle 3 varianter, og jeg er nu endt med Ubunto installeret på en ældre laptop med en driftssikker SSD disk. Det vil være nødvendigt at lære lidt om Linux, hvis man ikke kender det. Men det er god viden at tilegne sig....

På det valgte hardware installeres Oracle Java version 8 og dernæst følg installation af openHABian. Se link

I openHAB kan man bl.a. have disse integrationer, og jeg fokuserer her på dem, som er mærket med rød boks.1006814522_Arkitekturihc-user.thumb.png.a96ba83d53d0b3133954762e1c7ee57f.png

Efter installationen skal man angive ønskede integrationer - såkaldte bindings - og det gøres via paperUI, som default kan findes på http://lokalIPadresse:8080
Her vælges IHC Binding, som installeres - se skærmkopi:

BindingIHC.thumb.png.3cccbc9b8b3d3fdc59bbd742b89d06ce.png

Nu kan man benytte funktionalitet i paperUI til automatisk at identificere input- og outputs i sin IHC installation, men jeg bruger ikke dette. I stedet angiver jeg alt i filer, fordi det - i det lange løb - er det nemmeste at arbejde med. Filerne skal lagres i /etc/openhab2/conf/things/ folderen - dog ikke Synology, som bruger andre foldere.

Things

Først angives såkaldte Things, som er en forbindelse til fysiske ting - i dette tilfælde IHC Controller med forbundne enheder.
Herunder ses eksempel på en ihc.things fil:

ThingIHC.thumb.png.a2d8f45602ef793871249b90831f9ec2.png

Benyt ikke Notepad i Windows til editering, men brug i stedet Visual Studio Code, som er gratis og med sikkerhed uden virus. Windows Notepad laver nogle karakterer i filen, som ikke fungerer i Linux.

Bemærk "createChannelsAutomatically=false", hvilket gør, at bindingen ikke selv finder input og output. Læs mere her

Hvis direction ikke er udfyldt, kan den pågældende enhed - fx en stikkontakt - både ændres og aflæses af openHAB, hvis den ændres af svagstrømstryk. Dvs. en statusændring kan sendes fra openHAB til IHC og omvendt.

resourceID er entydig decimal værdi fra Visual, og man kan se den ved at holde Ctrl knappen nede, mens musen køres henover fx et svagstrømsinput.

direction="ReadOnly" betyder, at openHAB kun kan aflæses status og ikke sætte den. Í mit tilfælde er det en stikkontakt. direction="WriteOnly" betyder, at openHAB kun kan sende status, men modtager intet ved ændring. I mit tilfælde et det input og output tryk, som jeg sender til. 

pulseWidth=80 betyder, at der kun sendes en puls på 80 millisekunder, hvorefter signalet sættes tilbage. I mit tilfælde er for at gøre det samme som ved fysisk at trykke på et svagstrømstryk. I det viste eksempel kan jeg få stikkontakten til at tænde og slukke, men det sker ved at simulere tryk på et svagstrømstryk. På den måde aktiverer jeg relevante fb'ere i IHC i stedet for blot at ændre output status.

Items

Dernæst skal man oprette en ihc.items fil i folderen /etc/openhab2/conf/items/. Eksempelvis således:

Switch    KaelderVaerVestStikkontakt "Stikkontakt"    <poweroutlet>   {channel="ihc:controller:haldIHC:ThKaelderVaerVestStikkontakt,ihc:controller:haldIHC:ThKaelderVaerVestTrykNederstHojre,ihc:controller:haldIHC:ThKaelderVaerVestTrykNederstVenstre"}

Items er logiske objekter i openHAB, som har en status, og man ændre denne status. De kan forbindes til en thing, som viste i eksempler herover.

Bemærk at der er nævnt 3 Things i channel med komma imellem. Det betyder, at modtagne og sendte status er forbundet til alle 3 Things. Men fordi vi har ReadOnly og WriteOnly i Things definitionen, så er det ikke alt, som sendes eller modtages fra IHC Controlleren.

Det virker umiddelbart lidt besværligt, men fordelen er, at man altid vil have en openHAB, som er i sync med IHC også ved almindelig fysisk betjening samt at fb'ere aktiveres i stedet for blot at overskrive et output.
 

Item i eksemplet ovenfor - KaelderVaerVestStikkontakt - skal man dernæst placere i en fil kaldet ihc.sitemap som vist i denne linie:

Switch item=KaelderVaerVestStikkontakt

hvorved man kan tilgå det via en browser og se og ændre status. Se eksemper herunder:

browser.png.ef6f02ca11375a60ff4d6df4ca21e5ce.png

Det vil default også være port 8080 på aktuelle ip adresse.

En variant af switch er kip. Kip er karakteriseret ved, at du som bruger kan se, om der er lys eller ej (status) og du bruger dette til at beslutte, om du vil tænde eller slukke. Når det kommer til smart house, er det ikke altid optimalt, at aktuel status skal bestemme, om man vil tænde eller slukke. Ved kip forbinder jeg derfor altid to channels til hhv. Tænd og Sluk i min fb, og så lader svagstrømstrykket fortsat være forbundet til Kip i fb'en. Herved kan man undgå nogle udfordringer med kip.

Dimmer

Brug af lysdæmper i smart house er bedst med tilbagemelding, og det vil sige enten IHC wireless Ø80 eller den nye LED rs485 tavledimmer. I begge tilfælde skal det i openHAB være typen dimmer og resourceID skal pege på "Lys niveau" i Visual. Se eksempel tidligere med "ThKaelderVaerVestDimmer".

ihc.items skal være:

Dimmer     KaelderVaerVestDimmer "Spot i loft dimmer" <light>           {channel="ihc:controller:haldIHC:ThKaelderVaerVestDimmer"}

ihc.sitemap skal være:

Slider item=KaelderVaerVestDimmer

hvorved man får en "slider" som vist i tidligere skærmkopi.

Det var det! - så er man i gang med smart house til IHC med detailkontrol og fuld 2-vejs sync af ændringer. 

Tilmed er der rigtig mange muligheder i openHAB, og kan jeg ikke gennemgå alle her.

Link til kommentar
Del på andre sites

16 svar på dette spørgsmål

Recommended Posts

  • 0

God guide Ejvind. Men du bør lægge items og sitemap eksemplerne ind i en formatteret boks (tryk på <> i editor menuen når du skriver et indlæg). Det gør det langt mere læseligt..
 

1 time siden, EjvindHald skrev:

Dernæst skal man oprette en ihc.items fil i samme folder. Eksempelvis således:

Den skal ikke i samme folder som .things. Items skal i items folderen :)

Link til kommentar
Del på andre sites

  • 0

Har langt om længe fået OpenHab2 og HomeKit på RPI til at køre; 2 lampeudtag er indtil videre konfigureret for at teste forbindelserne - og de virker fint.

Nu ville jeg tilføje en IHC-lydgiver, som vi har, på ganske samme måde i things og items. Den dukker fint op i PaperUI og kan aktiveres derfra. Men hvad skal der til før den "opdages" af Hjem-appen på iPad/iPhone? (de to lampeudtag fungerer fortsat upåklageligt). Skal Homekit-service genstartes? - lyder mærkeligt, for ændringer i items og things filer slår igennem i PaperUI med det samme. Hvordan genstartes Homekit servicen i givet fald? (håber ikke det er nødvendigt at genstarte hele OpenHab - for det tager for det første lang tid - og jeg har læst flere historier om, at openhab så skal tilføjes igen til Homekit og alle items skal sættes op i hjem-appen igen...

Edit: Hmmm - andre lampeudtag kan godt tilføjes, så det må være noget med den måde jeg tilføjer IHC-lydgiveren på. Har denne defintion i things hhv. items:

Type switch     : SireneAllrum                  [resourceId=87899]

Switch  Sirene              "Sirene"            <alarm>    ["Switch"]      {channel="ihc:controller:IHCMMP51:SireneAllrum"}

Edit #2; hvad er de tilladte tags der, hvor jeg pt. har skrevet ["Switch"] - tror den går galt der

Redigeret af morten_j
Link til kommentar
Del på andre sites

  • 0

Start med at kontrollere, at det hele er ok i openHAB. Dvs. du tilføjer Sirene til en sitemap fil, som jeg har vist. Herefter skal du kunne aktivere sirenen via din browser. 

Det er vigtigt, at du ser, at det virker. I modsat fald er dit Item ikke aktivt og bliver dermed ikke altid eksponeret mod Homekit.

openHAB skal kunne genstarte uden problemer, så prøv det. Så længe du kun har få items, så er det mindre bøvlet, hvis det skal sættes op igen i Homekit.

 

Link til kommentar
Del på andre sites

  • 0

For en god ordens skyld synes jeg, at du skal lave en sitemap fil, så du får det testet udefra.

Jeg har selv benyttet den indbyggede integration til Homekit i nogle år. Men jeg har nu valgt at holde det helt separat - bl.a. for at undgå genopsætning af Homekit. Det kan eksempelvis ske, hvis du laver en slåfejl i din Things eller Items fil, så nogle Items forsvinder, indtil du har rettet fejlen.

Derfor bruger jeg nu Homebridge med bl.a. openhab-complete plugin. Desuden også MQTT med mqttthing plugin. Se sidste slide i denne video - https://youtu.be/7HDTbzu1vZI- hvor der er en tegning.

 

Link til kommentar
Del på andre sites

  • 0
2 timer siden, morten_j skrev:

@EjvindHald; ved du hvad en sirene skal tagges som i items (accessory tag)? Lighting går f.eks. ikke, men hvad skal den så hedde, så den opfylder kravene i https://www.openhab.org/addons/integrations/homekit/#homekit-add-on - synes ikke der er nogen, der lige passer

["Switchable"] er mit bud. Men jeg bruger ikke homekit, men derimod Google Assistant. Og jeg mener det er samme tag til begge.

Link til kommentar
Del på andre sites

  • 0
4 timer siden, morten_j skrev:

@EjvindHald; ved du hvad en sirene skal tagges som i items (accessory tag)? Lighting går f.eks. ikke, men hvad skal den så hedde, så den opfylder kravene i https://www.openhab.org/addons/integrations/homekit/#homekit-add-on - synes ikke der er nogen, der lige passer

Switchable fordi det formentlig er en almindelig output 24 switch, som du sætter on/off.

De hænger også sammen med Item typen. Item type Switch vil typisk være Switchable til Homekit, fordi den holder en simpel on/off værdi.

Homekit holder cache værdier, og ved ændringer i openHAB kan det nogle gange drille. Vent nogle gange op til 5 minutter, du kan også prøve at foretage log ud og log ind igen til iCloud. Endelig kan man i openhab karaf konsollen foretage reset pairing, men så bliver alt i Homekit dog nulstillet.

Link til kommentar
Del på andre sites

  • 0

Sorry - endnu et newbie-spørgsmål; jeg har et multitryk (tror jeg nok det hedder); 4 kontakter - de fungerer egentlig hver især som kip. Den ene aktiverer f.eks. lys over spisebord (+ nogle andre lys) - hvis man trykker en gang tændes - hvis man trykker en gang mere så slukkes. Men knappen har kun ét ID i IHC. Mit problem er, at Homekit ikke opfanger de "manuelle" tryk, så status i Homekit er forkert, hvis trykket har været anvendt.

Jeg har prøvet med 3 led/channels i items-filen - men jeg kan se i event-loggen at et manuelt tryk bliver opfattet som OFF>ON og et splitsekund derefter fra ON>OFF (eller omvendt).

Items ser således ud:

Switch  LysAllrum               "Lys spisebord" <light> ["Lighting"] {channel="ihc:controller:IHCMMP51:LampeudtagAllrum,ihc:controller:IHCMMP51:MultitrykAllrumOverstHojre,ihc:controller:IHCMMP51:MultitrykAllrumNederstHojre"}

Jeg har i ovenstående sat sidste led = off-knappen i multitrykket (der styrer andre kontakter også).

Eventlog ser således ud:

2020-08-27 21:07:28.929 [vent.ItemStateChangedEvent] - LysAllrum changed from OFF to ON
2020-08-27 21:07:29.440 [vent.ItemStateChangedEvent] - LysAllrum changed from ON to OFF

 

Link til kommentar
Del på andre sites

  • 0

Jeg kan desværre ikke hjælpe med homekit, da jeg ikke bruger det. 
Men jeg undre mig lidt over din items LysAllrum, og channel settings for denne. Kan du forklare den nærmere. Det ser ud som om, at du bruger forskellige tryk til samme item? 

Din items (dit tryk) opfører sig i øvrig helt korrekt, hvis du har sat dit tryk op som:

PulseWidth

i openhab. Så vil den gå ON, når du trykker på trykket, og få ms. efter, så vil den gå OFF. 

14 timer siden, morten_j skrev:

Men knappen har kun ét ID i IHC. Mit problem er, at Homekit ikke opfanger de "manuelle" tryk, så status i Homekit er forkert, hvis trykket har været anvendt.


Hvorfor har du behov for at vide status på trykket i Homekit? Trykket vil jo pr. definition altid være OFF, medmindre du trykker på det (manuelt) ?

Link til kommentar
Del på andre sites

  • 0

Tak begge to for hjælp. Jeg var nødt til at begynde forfra...

Så her er things:

{

Channels:
// remark
Type switch     : LampeudtagAllrum              [resourceId=83803, direction="ReadOnly"]                                       //remark
Type switch     : MultitrykAllrumOverstHojre    [resourceId=27738, direction="WriteOnly", pulseWidth=80, commandToReact="On"]  //tryk spisebord on
Type switch     : MultitrykAllrumNederstHojre    [resourceId=28250, direction="WriteOnly", pulseWidth=80, commandToReact="Off"] //tryk spisebord off
}

Og her items:

Switch  LysSpisebord    "Spisebordslys"   ["Lighting"]    {channel="ihc:controller:IHCMMP51:LampeudtagAllrum,ihc:controller:IHCMMP51:MultitrykAllrumOverstHojre,ihc:controller:IHCMMP51:MultitrykAllrumNederstHojre"}

Alle 3 channels dukker fint op under Control i Openhab og logikken virker faktisk fint i Openhab og over mod Homekit og tilbage - men selve lyset slår ikke til/fra, når jeg bruger Openhab/PaperUI eller Homekit

Hvis jeg manuelt bruger de to 2 tryk opfanger Openhab/Homekit dem også fint - og også status på lampeudtaget.

Så spørgsmålet er, hvorfor aktivering i Openhab/Homekit ikke påvirker lyset, når det virker den anden vej?!

Openhab-loggen ser således ud:

2020-08-28 23:46:49.017 [WARN ] [rver.impl.http.impl.AccessoryHandler] - Exception caught in web handler
java.lang.NullPointerException: null
	at io.github.hapjava.server.impl.http.impl.AccessoryHandler.channelActive(AccessoryHandler.java:39) ~[?:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:225) [bundleFile:4.1.42.Final]
	at io.netty.channel.AbstractChannelHandlerContext.access$200(AbstractChannelHandlerContext.java:56) [bundleFile:4.1.42.Final]
	at io.netty.channel.AbstractChannelHandlerContext$3.run(AbstractChannelHandlerContext.java:216) [bundleFile:4.1.42.Final]
	at io.netty.util.concurrent.DefaultEventExecutor.run(DefaultEventExecutor.java:66) [bundleFile:4.1.42.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044) [bundleFile:4.1.42.Final]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [bundleFile:4.1.42.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [bundleFile:4.1.42.Final]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_265]
2020-08-28 23:46:49.165 [WARN ] [rver.impl.http.impl.AccessoryHandler] - Exception caught in web handler
java.lang.NullPointerException: null
	at io.github.hapjava.server.impl.http.impl.AccessoryHandler.channelInactive(AccessoryHandler.java:45) ~[?:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:257) [bundleFile:4.1.42.Final]
	at io.netty.channel.AbstractChannelHandlerContext.access$300(AbstractChannelHandlerContext.java:56) [bundleFile:4.1.42.Final]
	at io.netty.channel.AbstractChannelHandlerContext$4.run(AbstractChannelHandlerContext.java:248) [bundleFile:4.1.42.Final]
	at io.netty.util.concurrent.DefaultEventExecutor.run(DefaultEventExecutor.java:66) [bundleFile:4.1.42.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044) [bundleFile:4.1.42.Final]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [bundleFile:4.1.42.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [bundleFile:4.1.42.Final]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_265]
2020-08-28 23:49:52.757 [WARN ] [.server.impl.connections.HttpSession] - Exception encountered while verifying pairing
java.lang.Exception: Unknown user: 3ED123C0-6FA9-4D40-A24A-52CCFDA551F0
	at io.github.hapjava.server.impl.pairing.PairVerificationManager.stage2(PairVerificationManager.java:113) ~[bundleFile:?]
	at io.github.hapjava.server.impl.pairing.PairVerificationManager.handle(PairVerificationManager.java:51) ~[bundleFile:?]
	at io.github.hapjava.server.impl.connections.HttpSession.handlePairVerify(HttpSession.java:127) [bundleFile:?]
	at io.github.hapjava.server.impl.connections.HttpSession.handleRequest(HttpSession.java:56) [bundleFile:?]
	at io.github.hapjava.server.impl.connections.ConnectionImpl.doHandleRequest(ConnectionImpl.java:56) [bundleFile:?]
	at io.github.hapjava.server.impl.connections.ConnectionImpl.handleRequest(ConnectionImpl.java:49) [bundleFile:?]
	at io.github.hapjava.server.impl.http.impl.AccessoryHandler.channelRead0(AccessoryHandler.java:52) [bundleFile:?]
	at io.github.hapjava.server.impl.http.impl.AccessoryHandler.channelRead0(AccessoryHandler.java:17) [bundleFile:?]
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) [bundleFile:4.1.42.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [bundleFile:4.1.42.Final]
	at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:56) [bundleFile:4.1.42.Final]
	at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:365) [bundleFile:4.1.42.Final]
	at io.netty.util.concurrent.DefaultEventExecutor.run(DefaultEventExecutor.java:66) [bundleFile:4.1.42.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044) [bundleFile:4.1.42.Final]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [bundleFile:4.1.42.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [bundleFile:4.1.42.Final]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_265]

 

Link til kommentar
Del på andre sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gæst
Svar på dette spørgsmål

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loader...
 Share

×
×
  • Tilføj...

Important Information

Privatlivspolitik og We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.

1200x630bb.png

ok