xibriz Skrevet 30. januar 2018 Skrevet 30. januar 2018 Jeg har i det siste begynt å skrive mer og mer regler i openHAB så jeg tenkte det kunne være fint med en inspirasjonstråd/syntakshjelpetråd. Her er en jeg nettopp lagde: rule "Turn on evening mood" when Item EveningMoodVirtual received command ON then //Turn off all lights in gFirstFloor and not in gEveningMood gFirstFloor.members.filter[i | (!i.getGroupNames.contains("gEveningMood") && i.state != OFF)].forEach(i | i.sendCommand(OFF)) gFirstFloor.members.filter[i | (i.getGroupNames.contains("gEveningMood") && i instanceof DimmerItem)].forEach(i | i.sendCommand(50)) end Forklaring: Den første linjen finner alle medlemmer i gruppen gFirstFloor og filtrerer ut alle som ikke er medlem i gruppen gEveningMood og de som allerede er av, for deretter og slå av de som gjenstår. Den andre linjen finner alle medlemmer i gruppen gFirstFloor og filterer ut alle som er medlem i gruppen gEveningMood og som er dimbare, for så å dimme de til 50%. 1 Siter
Alpøy Skrevet 30. januar 2018 Skrevet 30. januar 2018 (endret) Har laget en "offline rapport" løsning på noder som ikke lenger oppdaterer seg. Dvs. jeg looper en gruppe etter items med NULL verdier (jeg setter expire på alle sensorer/målere som jeg forventer rapporterer innen viss tid **) og genererer en rapport som blir mailet. Siden jeg bruker en lambda for å kjøre rapporten kan jeg gi den et argument med hvilke gruppe den faktisk skal sjekke, så det jeg har gjort er å lage forskjellige grupper...de som jeg forventer update innen 12timer, 6timer osv. Dermed kan jeg bruke en enkel cron rule slik for å kjøre lambdaen/function (denne vil f.eks. kjøre hver 12.time og sjekke alle members i gruppen 'gTwelveHourStateCheck') : rule "gTwelveHourStateCheck" when Time cron "0 0 12 * * ?" // sjekk hver 12.time then runScheduleCheck.sendCommand('gTwelveHourStateCheck') end items: Group gReportedOfflineNodes Group gTwelveHourStateCheck (gHourStateCheck) Group gHourStateCheck Rule: val Functions$Function1<String,Number> runScheduleCheck = [ String scheduleGroupStringName | var scheduleGroup = gHourStateCheck.members.filter(n|n.name == scheduleGroupStringName).head as GroupItem if (scheduleGroup === null) return null scheduleGroup.allMembers.forEach[i| if (i.state === NULL) { if (gReportedOfflineNodes.members.filter[x|x.name == i.name].head === null) { // Sjekk om node allerede er rapportert tidligere (skal ligge i gReportedOfflineNodes) var msg = 'Advarsel (expire): Utløpt oppdatering fra node: ' + i.name + '.' logInfo('Status',msg) gReportedOfflineNodes.addMember(i) } } if ((i.state != NULL) && (gReportedOfflineNodes.members.filter[x|x.name == i.name].head !== null)) { // Fjern evt. noder som er kommet online igjen gReportedOfflineNodes.removeMember(i) } ] // Send rapport if (gReportedOfflineNodes.members.size > 0) { val offLineNodeString = new StringBuilder gReportedOfflineNodes.members.forEach[x | offLineNodeString.append("\r\n - " + x.name)] sendMail("[email protected]", "openHAB rapport over OFFLINE noder", offLineNodeString.toString) } return null ] ** For å sette expire på et item: Number minTemperatur { zwave="blabla", expire="3h" } // Dette gjør at dette item'et blir NULL etter 3 timer hvis ingen oppdatering er kommet Dette kan sikkert forbedres, men fungerer greit for min del. Håper det kan hjelpe noen ;-) Endret 31. januar 2018 av Alpøy 1 Siter
berland Skrevet 30. januar 2018 Skrevet 30. januar 2018 1 time siden, xibriz skrev: Den første linjen finner alle medlemmer i gruppen gFirstFloor og filtrerer ut alle som ikke er medlem i gruppen gEveningMood og de som allerede er av, for deretter og slå av de som gjenstår. Jeg innbiller meg at dette også kan gjøres med gEveningMood.sendCommand(OFF) Eller, da får eventuelt med lys som ikke er i FirstFloor også..? Siter
berland Skrevet 30. januar 2018 Skrevet 30. januar 2018 Alpøy, den offline-warning-saken passet meg perfekt, har planlagt i noen uker å lage noe slikt, men her kom en pen løsning. Kjører du OpenHAB 1.X? Min OpenHAB 2.2 klagde litt på syntax, og det virket ikke ut av boksen. Jeg endte opp med å endre Cron-regelen til runScheduleCheck.apply(Offlinewarning) (hvor Offlinewarning er gruppa som alle sensorene++ ble lagt inn i) og starten av lambdaen endret jeg til val Functions$Function1<GenericItem, String> runScheduleCheck = [ GroupItem scheduleGroup | if (scheduleGroup === null) return null scheduleGroup.members.forEach[i| for å få det til å funke. Siter
xibriz Skrevet 31. januar 2018 Forfatter Skrevet 31. januar 2018 9 timer siden, berland skrev: Jeg innbiller meg at dette også kan gjøres med gEveningMood.sendCommand(OFF) Eller, da får eventuelt med lys som ikke er i FirstFloor også..? Se for deg at items-filen ser slik ut: Group gFirstFloor Group gEveningMood Switch ZWLight1 "Supersterkt lys" (gFirstFloor) Dimmer ZWLight2 "Behagelig lys" (gFirstFloor, gEveningMood) Alle lysene er i utgangspunktet på. Hvis jeg da kjører `gEveningMood.sendCommand(OFF)` får jeg motsatt effekt (jeg vil jo ha koselysene på). Jeg kan ikke kjøre `gFirstFloor.sendCommand(OFF)` uten å kjøre `gEveningMood.sendCommand(ON)` etterpå, men det er litt unødvendig å slå av alle lysene for så å slå på de jeg vil ha på. Nå er det ikke 2 lys det er snakk om, men 15 lys i `gFirstFloor` og en del lys i `gEveningMood` Siter
xibriz Skrevet 31. januar 2018 Forfatter Skrevet 31. januar 2018 8 timer siden, berland skrev: Kjører du OpenHAB 1.X? Min OpenHAB 2.2 klagde litt på syntax, og det virket ikke ut av boksen. Jeg måtte oppdatere syntax i noen regler når jeg oppgraderte fra 2.1 til 2.2. Det virket for meg at de var blitt litt nøyere på syntaxen. Siter
Alpøy Skrevet 31. januar 2018 Skrevet 31. januar 2018 8 hours ago, berland said: Alpøy, den offline-warning-saken passet meg perfekt, har planlagt i noen uker å lage noe slikt, men her kom en pen løsning. Kjører du OpenHAB 1.X? Min OpenHAB 2.2 klagde litt på syntax, og det virket ikke ut av boksen. Jeg endte opp med å endre Cron-regelen til runScheduleCheck.apply(Offlinewarning) (hvor Offlinewarning er gruppa som alle sensorene++ ble lagt inn i) og starten av lambdaen endret jeg til val Functions$Function1<GenericItem, String> runScheduleCheck = [ GroupItem scheduleGroup | if (scheduleGroup === null) return null scheduleGroup.members.forEach[i| for å få det til å funke. Jeg bruker OH2 men ser at jeg har glemt å legge til et par grupper. For at jeg skal kunne få lambdaen til å forstå at dette var en "gruppe" (og at jeg kan bruke den i syntax) så søker jeg frem den gruppen i første linje i lambdaen (den du fjernet) (alle gruppene som skal kjøres sjekk på må være medlem av gHourStateCheck). Dette pga. jeg sender gruppenavnet som string....jeg fikk ikke til å sende gruppen som et "objekt" først mener jeg. Men hvis du får det til å virke uten å passe argument som string så er intet bedre, kan du verifisere at koden virker som den skal slik du gjorde det? :-) Siter
berland Skrevet 31. januar 2018 Skrevet 31. januar 2018 19 minutter siden, Alpøy skrev: Men hvis du får det til å virke uten å passe argument som string så er intet bedre, kan du verifisere at koden virker som den skal slik du gjorde det? :-) Ja, koden min er i "produksjon" og sendte pushover til telefonen når noen noder ble manuelt satt til NULL. Etter å ha fiklet i ørten items-filer, så burde egentlig hele systemet gått ned i dag, men fortsatt virket alt som det skulle i dag tidlig. Ser nå hva jeg misforstod med gruppestrukturen, som gjorde at det ikke gikk med en gang. 1 Siter
Alpøy Skrevet 31. januar 2018 Skrevet 31. januar 2018 Ok bra ?, skal oppdatere koden og eksemplet senere idag ? Siter
Anbefalte innlegg
Bli med i samtalen
Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.